package edu.nf.aop.proxy;

import edu.nf.aop.annotation.Ignore;
import edu.nf.aop.AopProxy;
import edu.nf.aop.context.ProceedingJoinPoint;

import java.lang.reflect.Method;

/**
 * @author wangl
 * @date 2024/4/22
 */
public abstract class AbstractAopProxy implements AopProxy {

    /**
     * 创建回调上下文并执行目标方法上定义的所有拦截器（排除继承自Object以及标识由Ignore注解的方法）
     * @param targetClass 目标对象Class
     * @param method 目标方法
     * @param args 目标方法所需的参数
     * @return 目标方法返回值
     */
    protected Object invoke(Class<?> targetClass, Method method, Object[] args) {
        try {
            Object target = targetClass.getDeclaredConstructor().newInstance();
            if (!method.getDeclaringClass().equals(Object.class) && !method.isAnnotationPresent(Ignore.class)) {
                //连接点处理
                return new ProceedingJoinPoint(target, method, args).proceed();
            }
            //调用目标方法
            return method.invoke(target, args);
        } catch (Throwable e) {
            throw new RuntimeException("Invoke target error.", e);
        }
    }
}